package cn.lhf.cd;

import cn.lhf.cd.annotation.FXController;
import cn.lhf.cd.controller.LoginController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Labeled;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 * javafx的入口类，与程序入口分开的原故：
 * 在openjdk上启动报错：缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
 */
public class FXApplication extends Application {
    private static Stage primaryStage;

    /**
     * 获取Stage实例
     *
     * @return stage
     */
    public static Stage getPrimaryStage() {
        return primaryStage;
    }

    /**
     * 显示视图、切换页面
     *
     * @param clz 视图类
     * @param callback 神奇的回调
     * @throws Exception 神奇的异常
     */
    public static <T> void showView(Class<? extends T> clz, Callback<T, Void> callback) throws Exception {
        FXMLLoader loader = loadFXML(clz);
        Scene scene = new Scene(loader.load());
        if (callback != null)   //如果有回调就执行回调
            callback.call(loader.getController());
        scene.getStylesheets().add(clz.getResource("/css/application.css").toExternalForm());   //设置界面风格
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * 加载Controller对应的fxml
     * @param clz 神奇的class对象
     * @return fxml加载器实例
     * @throws Exception 神奇的异常
     */
    public static FXMLLoader loadFXML(Class<?> clz) throws Exception {
        FXController annotation = clz.getAnnotation(FXController.class);
        if (annotation == null) {   //传过来的class没有FXController注解
            throw new Exception(clz.getName() + "不是Controller");
        }
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(clz.getResource(annotation.path()));
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        return loader;
    }

    /**
     * 关闭窗口
     */
    public static void close() {
        primaryStage.close();
    }

    /**
     * 初始化fx程序
     *
     * @param primaryStage primaryStage
     * @throws Exception 神奇的异常
     */
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXApplication.primaryStage = primaryStage;    //保存stage对象
        showView(LoginController.class, null); //显示第一个页面
    }

    public static void setTitle(String title) {
        primaryStage.setTitle(title);
    }

    public static void setAlertFont(Alert alert, Font font) {
        alert.getButtonTypes().stream().map(alert.getDialogPane()::lookupButton).forEach(btn -> ((Button) btn).setFont(font)); //设置按钮字体
        alert.getDialogPane().getChildren().stream().forEach(node -> {
            if (node instanceof Labeled) {
                ((Labeled) node).setFont(font);
            }
        });
    }
}
